home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 1997 / HAM Radio 1997.iso / vbxs / vb3d.000 / module1.bas < prev    next >
BASIC Source File  |  1996-04-08  |  5KB  |  152 lines

  1. DefInt A-Z
  2.  
  3. ' User defined type defining a line by start point
  4. ' (X,Y,Z) and end point (X1,Y1,Z1).
  5. Type LineType
  6.     X As Integer
  7.     Y As Integer
  8.     Z As Integer
  9.     X1 As Integer
  10.     Y1 As Integer
  11.     Z1 As Integer
  12. End Type
  13.  
  14. ' An array to store lines
  15. Global points(100) As LineType
  16.  
  17. Global Xs(100) As Single, Ys(100) As Single, Xe(100) As Single, Ye(100) As Single, Xn(100) As Single, Yn(100) As Single
  18.  
  19. ' Arrays to store screen coordinates of last drawn lines
  20. Global XOldStart(100) As Single, YOldStart(100) As Single, XOldEnd(100) As Single, YOldEnd(100) As Single
  21.  
  22. ' Arrays to store point coordinates. Index is point number
  23. Global X(100) As Single, Y(100) As Single, Z(100) As Single
  24.  
  25. ' Arrays to store point numbers - Pointers1 for start points, Pointers2 for end points
  26. ' Index is line #, value is point #
  27. Global Pointers1(100) As Single, Pointers2(100) As Single
  28.  
  29. ' List of points to rotate - value is point number
  30. Global PointsToRotate(100) As Single
  31.  
  32. 'Sine and cosine lookup tables
  33. Global Cosine&(360), Sine&(360)
  34.  
  35. Global NumberOfLines
  36. Global NumberOfPoints
  37. Global NumberOfPointsToRotate
  38.  
  39. ' Control variables
  40. Global AtLoc
  41. Global Mxm
  42. Global Mym
  43. Global Mzm
  44. Global Speed
  45.  
  46.     Global D1
  47.     Global D2
  48. ' Constants used in program
  49. Global Const CDERR_CANCEL = 32755' Common dialog cancel button was clicked
  50.  
  51. Sub DeterminePointsToRotate ()
  52. 'Here comes the hard part... Consider this scenario:
  53.  
  54. 'We have two connected lines, like this:
  55.  
  56. '   1--------2 and 3
  57. '            |
  58. '            |
  59. '            |
  60. '            |
  61. '            4
  62. 'Where 1,2, 3, & 4 are the starting and ending points of each line.
  63. 'The first line consists of points 1 & 2  and the second line
  64. 'is made of points 3 & 4.
  65. 'So, you ask, what's wrong? Nothing, really, but don't you see that
  66. 'points 2 and 3 are really at the sample place? Why rotate them twice,
  67. 'that would be a total waste of time? The following code eliminates such
  68. 'occurrences from the line table. (great explanation, huh?)
  69.  
  70. 'take all of the starting & ending points and put them in one big
  71. 'array...
  72. NumberOfPoints = 0
  73. For LineNumber = 0 To NumberOfLines - 1
  74.     X(NumberOfPoints) = points(LineNumber).X
  75.     Y(NumberOfPoints) = points(LineNumber).Y
  76.     Z(NumberOfPoints) = points(LineNumber).Z
  77.     NumberOfPoints = NumberOfPoints + 1
  78.     X(NumberOfPoints) = points(LineNumber).X1
  79.     Y(NumberOfPoints) = points(LineNumber).Y1
  80.     Z(NumberOfPoints) = points(LineNumber).Z1
  81.     NumberOfPoints = NumberOfPoints + 1
  82. Next LineNumber
  83.  
  84. 'Now set up two sets of pointers that point to each point that a line
  85. 'is made of... (in other words, scan for the first occurrence of each
  86. 'starting and ending point in the point array we just built...)
  87. For LineToTest = 0 To NumberOfLines - 1
  88.     XTest = points(LineToTest).X
  89.     YTest = points(LineToTest).Y
  90.     ZTest = points(LineToTest).Z            'get the 3 coordinates of the start point
  91.     For PointToTest = 0 To NumberOfPoints - 1         'scan the point array
  92.         If X(PointToTest) = XTest And Y(PointToTest) = YTest And Z(PointToTest) = ZTest Then
  93.             Pointers1(LineToTest) = PointToTest    'set the pointer to point to the
  94.             Exit For            'point we have just found
  95.         End If
  96.     Next PointToTest
  97.     XTest = points(LineToTest).X1           'do the same thing that we did above
  98.     YTest = points(LineToTest).Y1           'except scan for the ending point
  99.     ZTest = points(LineToTest).Z1           'of each line
  100.     For PointToTest = 0 To NumberOfPoints - 1
  101.         If X(PointToTest) = XTest And Y(PointToTest) = YTest And Z(PointToTest) = ZTest Then
  102.             Pointers2(LineToTest) = PointToTest
  103.             Exit For
  104.         End If
  105.     Next PointToTest
  106. Next LineToTest
  107. 'Okay, were almost done! All we have to do now is to build a table
  108. 'that tells us which points to actually rotate...
  109. NumberOfPointsToRotate = 0
  110. For LineToTest = 0 To NumberOfLines - 1
  111.     StartPointNo = Pointers1(LineToTest)
  112.     EndPointNo = Pointers2(LineToTest)
  113.     If NumberOfPointsToRotate = 0 Then
  114.         PointsToRotate(NumberOfPointsToRotate) = StartPointNo
  115.         NumberOfPointsToRotate = NumberOfPointsToRotate + 1
  116.     Else
  117.         Found = 0
  118.         For PointToTest = 0 To NumberOfPointsToRotate - 1
  119.             If PointsToRotate(PointToTest) = StartPointNo Then
  120.                 Found = -1
  121.                 Exit For'already in list
  122.             End If
  123.         Next PointToTest
  124.         If Not Found Then PointsToRotate(NumberOfPointsToRotate) = StartPointNo
  125.         NumberOfPointsToRotate = NumberOfPointsToRotate + 1
  126.     End If
  127.  
  128.     Found = 0
  129.     For PointToTest = 0 To NumberOfPointsToRotate - 1
  130.         If PointsToRotate(PointToTest) = EndPointNo Then
  131.             Found = -1
  132.             Exit For
  133.         End If
  134.     Next PointToTest
  135.     If Not Found Then PointsToRotate(NumberOfPointsToRotate) = EndPointNo
  136.     NumberOfPointsToRotate = NumberOfPointsToRotate + 1
  137. Next LineToTest
  138. End Sub
  139.  
  140. Sub MakeSinCosTables ()
  141. 'The following for/next loop makes a sine & cosine table.
  142. 'Each sine & cosine is multiplied by 1024 and stored as long integers.
  143. 'This is done so that we don't have to use any slow floating point
  144. 'math at run time.
  145. A% = 0
  146. For I! = 0 To 359 / 57.29577951 Step 1 / 57.29577951
  147.     Cosine&(A%) = Int(.5 + Cos(I!) * 1024)
  148.     Sine&(A%) = Int(.5 + Sin(I!) * 1024): A% = A% + 1
  149. Next
  150. End Sub
  151.  
  152.